Deep Learning for Human Language Processing Part 6(P12 to P13)
课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频地址:https://www.bilibili.com/video/BV1RE411g7rQ?p=1
参考资料:https://blog.csdn.net/qq_44574333/category_10304412_2.html
备注:图片均来自于课件。
这次回顾P12至P13,这部分介绍了语音分离问题。
语音分离(Speech Separation)
例子:
鸡尾酒效应是指,在嘈杂的环境中,人类可以专注于单个语者发出的声音,语音分离的目标是让机器做到这点。
具体来说,语者分离问题可以分为两类:
- 语音增强:语音,非语音分离(降噪)。
- 语者分离:多人说话的场景。
这部分主要介绍语者分离。
语者分离
这部分只讨论特殊语者分离问题:
- 假设输入和输出的长度相同。
- 专注于两位语者。
- 专注于单个麦克风。
- 语者独立:训练和测试的语者完全不同。
图示:
数据收集
这部分成对的数据很容易收集,只要将两个语者的声音叠加即可:
评估方法
这部分介绍语者分离问题的评估方法,这里假设
- 假设模型的输出为为$ X^{\star}$。
- 正确答案为$\hat X$。
信噪比(SNR)
定义残差:
SNR定义为:
总体来说,我们希望$|E |$越小越好,所以$SNR$越大,模型的输出也好。
SNR有两个问题:
- 如果$ X^{\star}$和$\hat X$平行,但是$ X^{\star}$强度较低,$|E |$会很大,$SNR$会很小;然而实际上$ X^{\star}$的效果是很好的。
- 如果$ X^{\star}$和$\hat X$夹脚为锐角,那么只要简单增加$ X^{\star}$的强度,就会增加$SNR$,但实际上$ X^{\star}$的效果并没有变好。
图示:
Scale invariant signal-to-distortion ratio (SI-SDR)
为了改进之前的问题,提出了SI-SDR:
其中$X_T$是$X^{\star}$在$\hat X$上的投影,$X_E$是残差,和$SNR$一样,该指标越大,说明$X^{\star}$效果越好:
之前两个问题的解决:
如果此时$ X^{\star}$和$\hat X$平行,那么$X_E=0$,${SISDR}=\infty$。
输出长度大小不会改变该指标:
其他
其余的评估度量还有
- PESQ
- STOI
这部分从略。
语者分离问题的评估
计算分离前后,对同一个向量的$SI-SDR$之差:
问题
之前介绍的度量是可微分的,所以问题似乎解决了,但是有如下的问题:
我们并不知道$(X_1,X_2)$对应的是(男性,女性)还是(女性,男性),之所以无法事先指定顺序,是因为训练和测试的语者完全不同。
具体来说,假设我们有$k$个输出$a_1,\ldots, a_k$,我们有$k$类语者$s_1,\ldots,s_k$,现在的问题是没有确定的排列$p_i$,使得$a_{i}$对应$s_{p_i}$。
解决方法
为了解决之前的问题,有如下几种方法。
Masking
输入输出都可以理解为矩阵,所以问题描述如下:
注意到语者分离的特点是,输出和输入非常接近,所以有人提出生成两个Mask,然后直接和输入相乘即可:
这里的Mask可以是连续或者二进制的,基于该思路有多种方法。
IBM(Ideal Binary Mask)
首先将音频表示为频谱,假设两个语者对应的矩阵为$X_{1},X_2$,那么构造矩阵:
利用$X\odot M_i $近似$X_i$。
现在有了Mask标签,所以训练一个模型近似该标签即可:
该方法似乎没有解决之前的问题,但是现在输出的关系是相互依赖的。
Deep Clustering
首先从图示来理解:
具体来说:
- $D\times T$的输入转换成$D\times T \times A$。
- 对$D\times T$个向量做K-means。(这里$k=2$)
- 然后由此产生Mask。
那么该方法如何训练呢(注意到标准的Mask是已知的),具体想法如下:
- 训练Embedding Generation:
- 不同语者的网格距离很远。
- 同一语者的网格彼此靠近。
该方法的神奇之处在于,在训练时使用两个语者($k=2$),但测试时可以使用三个语者($k=3$)。
该方法的缺点是并不是端到端的,但实际效果很好。
PIT(Permutation Invariant Training)
之前的问题是没有确定的排列,那么现在从这点解决。
思路:
给定语者分离模型$\theta^i$,我们可以确定排列——选择Loss最小的排列;但是这样的问题是我们需要确定排列才能训练,而这事先是不知道的。
解决方法:
- 随机初始化排列。
- 训练网络。
- 决定排列。
- 返回步骤一。
注意到训练开始是非常不稳定的:
一般训练分为两个阶段:
- 第一阶段训练一个基础模型。
- 根据第一阶段的模型决定排列,然后重新训练模型。
TasNet(TasNet – Time-domain Audio Separation Network)
网络架构:
注意输入输出是音频,并不是声学特征。
Encoder和Decoder部分:
- Encoder:线性变换,将16维的输入变成512维的输出。(作用类似傅立叶变换)
- Decoder:线性变换,将512维的输入变成16维的输出。(作用类似傅立叶逆变换)
Separator:
多层一维卷积,最后一层作用sigmoid,然后生成两个Mask:
细节架构:
这样做的原因是,重复多次CNN可以看到更长的信息,例如重复3次,模型可以考虑1.53秒的信息。
此外模型中还使用了Depthwise Separable Convolution的技术,以此减少参数数量,链接如下:
https://www.bilibili.com/video/BV1yy4y1B7ny?p=5
一些实验结果
人们也将模型中卷积部分替换为RNN,效果对比(不难看出CNN的效果比RNN好):
横轴为起始位置。
完整的结果:
其他问题
语者数量未知
假设我们并不知道语者的数量,那么该如何解决呢?一个思路是每次分离一个语者:
该方法需要判断何时只剩下一个语者。
多麦克风
端到端训练:
基于任务的优化
根据不同的任务选择不同的度量,这部分只是一笔带过。
补充文献
- Denoise Wavnet [Rethage, et al., ICASSP’18]
- Chimera++ [Wang, et al., ICASSP’18]
- Phase Reconstruction Model [Wang, et al., ICASSP’19]
- Deep Complex U-Net: Complex masking [Choi, et al., ICLR’19]
- Deep CASA: Make CASA great again! [Liu, et al., TASLP’19]
- Wavesplit: state-of-the-art on benchmark corpus WSJ0-2mix [Zeghidour, et al., arXiv’20]